<?php
/**
 * 管理员类.
 * User: 1874
 * Date: 2019/5/5
 * Time: 16:32
 */
namespace app\adminplatform\controller;

use app\adminplatform\model\Admin as AdminModel;
use app\adminplatform\model\AuthGroup;
use app\adminplatform\model\BackMsg;
use app\adminplatform\model\City;
use app\adminplatform\model\Log;
use think\facade\Config;
use think\facade\Request;
use think\facade\Session;
use think\facade\View;

class Admin extends Initial {
    /*
     * 管理员列表
     */
    public function adminList(){
        //管理员信息
        $userData = Session::get('userData');
        //当前管理员信息
        //$adminInfo = AdminModel::getAdminInfo(["ad_id"=>$userData["ad_id"]]);
        //省市县筛选
        $map = City::cityScreening();
        if(Request::get('name')) $map[] = ['ad_name','like','%'.Request::get('name').'%']; //姓名
        if(Request::get('phone')) $map[] = ['ad_phone','=',Request::get('phone')];         //联系方式
        if(Request::get('status') != '') $map[] = ['ad_status','=',Request::get('status')];//状态
        if(Request::get('roleId')) $map[] = ['ag_id','=',Request::get('roleId')];            //角色id
        //id不等于当前登录管理员
        $map[] = ['ad_id', '<>', $userData['ad_id']];
        $map[] = ['ad_role', '<>', 0];
        //当前管理员所管的下级管理员id
        $roleIds = findChildLevel(AuthGroup::getAuthGroupList()->toArray(), 'ag_pid', "ag_id", $userData['ad_role'], 1, 'ag_id');
        //管理员信息
        $map[] = ['ad_role', 'in', implode(',', $roleIds)];
        $info = AdminModel::getAdminPage($map);
        //管理员权限
        $rules = ['Admin/adminAdd', 'Admin/adminEdit','Admin/adminDel', 'Admin/adminDelAll'];
        $check = AuthGroup::checkMethodArray($userData, $rules);

        View::assign('info',$info);
        View::assign('check',$check);
        View::assign('province', City::getCityTypeList(1)); //省份信息
        return View::fetch('adminList');
    }
    /*
     * 获取当前管理员所管的下级管理员
     */
    public function getChildAuthGroupList(){
        $userData = Session::get('userData');
        //当前管理员只能创建下级部门的管理员
        $role = AuthGroup::getChildAuthGroup(AuthGroup::getAuthGroupList()->toArray(), $userData["ad_role"]);
        return json($role);
    }
    /*
     * 管理员个人信息
     */
    public function adminInfo(){
        $userData = Session::get('userData');
        //获取关联信息
        $info = AdminModel::getAdminInfo(["ad_id"=>$userData["ad_id"]], 2);
        //查询该管理员的省市县
        $info['cityInfo'] = City::getParentCityAll($info['ad_cityId'], 'ci_id');
        if(count($info['cityInfo']) < 1) {
            $info['cityInfo']['province'] = 0;
            $info['cityInfo']['city'] = 0;
        }
        //角色
        if(empty($info['ag_name'])) $info['ag_name'] = "最高管理员";
        View::assign('info',$info);
        View::assign('province', City::getCityTypeList(1)); //省份信息
        View::assign('city', City::getUnderCity($info['cityInfo']['province'])); //城市信息
        View::assign('town', City::getUnderCity($info['cityInfo']['city'])); //区县信息
        return View::fetch('adminInfo');
    }
    /*
     * 管理员个人信息修改
     */
    public function adminInfoEdit(){
        if(Request::isPost()){
            $request = Request::post();
            $map['ad_id'] = $request['id'];
            $map['ad_name'] = $request['name'];
            $map['ad_userNum'] = $request['usernum'];
            $map['ad_phone'] = $request['phone'];
            $map['ad_cityId'] = $request['town'];
            if(!empty($request['role'])) $map['ad_role'] = $request['role'];
            if($request['password'] != '') $map['ad_password'] = sha1(md5($request['password']));
            if($request['status'] != '') $map['ad_status'] = $request['status'];
            //头像不为空时
            if($request['header'] != '') {
                $map['ad_headerImg'] = $request['header'];
                //如果已更换头像则删除原头像
                if($request["originalHeader"] && $request["originalHeader"] != $request["header"]){
                    unlink(Config::get('app.upload_url').$request["originalHeader"]);
                }
            }
            //如果账号发生改变
            if($request['account'] != $map['ad_userNum']){
                //检查新账号是否重复
                if(AdminModel::getAdminInfo(["ad_userNum"=>$map['ad_userNum']], 1)) {
                    return json(['info'=>'该账号已存在','status'=>0]);
                }
            }
            checkField($map);
            //修改信息
            $info = AdminModel::update($map, ["ad_id"=>$map["ad_id"]]);
            if($info){
                //如果编辑的自己的信息
                $userData = Session::get('userData');
                $userData['ad_name'] = $map['ad_name'];
                $userData['ad_userNum'] = $map['ad_userNum'];
                //改变session
                Session::set('userData',$userData);
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'编辑管理员【'.$map['ad_name'].'】');

                $data = ['info'=>'编辑成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，信息没有改变','status'=>0];
            }

        }else{
            $data = ['info'=>'请求错误','status'=>0];
        }
        return json($data);
    }
    /*
     * 管理员新增
     */
    public function adminAdd(){
        if(Request::isPost()){
            $request = Request::post();
            $map['ad_name'] = $request['name'];
            $map['ad_userNum'] = $request['usernum'];
            $map['ad_phone'] = $request['phone'];
            $map['ad_role'] = $request['roleId'];
            $map['ad_password'] = sha1(md5($request['password']));
            $map['ad_cityId'] = $request['town'];
            $map['ad_status'] = $request['status'];
            $map['ad_addTime'] = time();
            //检查账号是否重复
            if(AdminModel::getAdminInfo(["ad_userNum"=>$map['ad_userNum']], 1)) {
                return json(['info'=>'该账号已存在','status'=>0]);
            }
            checkField($map);
            //新增信息
            $info = AdminModel::create($map);
            if($info){
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'新增管理员【'.$map['ad_name'].'】');

                $data = ['info'=>'新增成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，新增失败了','status'=>0];
            }
            return json($data);
        }
        //管理员信息
        //$userData = Session::get('userData');
        //当前管理员信息
        //$adminInfo = AdminModel::getAdminInfo(["ad_id"=>$userData['ad_id']]);
        //当前管理员只能创建下级部门的管理员
        //$role = findChildLevel(AuthGroup::getAuthGroupList()->toArray(), 'ag_pid', "ag_id", $adminInfo['ad_role']);
        //if(!$role) alertDemo("您暂无可添加的下级角色");

        //View::assign('role',$role);
        View::assign('province', City::getCityTypeList(1)); //省份信息
        return View::fetch('adminAdd');
    }
    /*
     * 管理员修改
     */
    public function adminEdit(){
        if(Request::isPost()){
            $request = Request::post();
            $map['ad_id'] = $request['id'];
            $map['ad_name'] = $request['name'];
            $map['ad_userNum'] = $request['usernum'];
            $map['ad_phone'] = $request['phone'];
            $map['ad_cityId'] = $request['town'];
            if(!empty($request['roleId'])) $map['ad_role'] = $request['roleId'];
            if($request['password'] != '') $map['ad_password'] = sha1(md5($request['password']));
            if($request['status'] != '') $map['ad_status'] = $request['status'];
            //如果账号发生改变
            if($request['account'] != $map['ad_userNum']){
                //检查新账号是否重复
                if(AdminModel::getAdminInfo(["ad_userNum"=>$map['ad_userNum']], 1)) {
                    return json(['info'=>'该账号已存在','status'=>0]);
                }
            }
            checkField($map);
            //修改信息
            if(AdminModel::update($map, ["ad_id"=>$map['ad_id']])){
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'编辑管理员【'.$map['ad_name'].'】');

                $data = ['info'=>'编辑成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，信息没有改变','status'=>0];
            }
            return json($data);
        }
        //管理员信息
        //$userData = Session::get('userData');
        //当前登录管理员信息
        //$adminInfo = AdminModel::getAdminInfo(["ad_id"=>$userData['ad_id']]);
        //当前登录管理员只能创建下级部门的管理员
        //$role = findChildLevel(AuthGroup::getAuthGroupList()->toArray(), 'ag_pid', "ag_id", $adminInfo['ad_role']);
        //if(!$role) alertDemo("您的下级没有可管理角色，不能编辑管理员信息");
        $id = Request::get('id');
        //当前编辑管理员信息
        $info = AdminModel::getAdminInfo(["ad_id"=>$id], 2);
        //查询该管理员的省市县
        $info['cityInfo'] = City::getParentCityAll($info['ad_cityId'], 'ci_id');

        View::assign('info',$info);
        //View::assign('role',$role);
        View::assign('province', City::getCityTypeList(1)); //省份信息
        View::assign('city', City::getUnderCity($info['cityInfo']['province'])); //城市信息
        View::assign('town', City::getUnderCity($info['cityInfo']['city'])); //区县信息
        return View::fetch('adminEdit');
    }
    /*
     * 管理员删除
     */
    public function adminDel(){
        //判断请求类型
        if(!Request::isPost()){
            $data = ['info'=>'请求类型不是这个哦，亲','status'=>0];
        }else{
            $adId = Request::post('id');
            //查询
            $admin = AdminModel::getAdminInfo(["ad_id"=>$adId]);
            if($admin->delete()){
                //删除头像
                if(!empty($admin->ad_headerImg)) unlink(Config::get('app.upload_url').$admin->ad_headerImg);
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'删除管理员【'.$admin->ad_name.'】');
                $data = ['info'=>'删除成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，删除失败了','status'=>0];
            }
        }

        return json($data);
    }
    /*
     * 管理员批量删除
     */
    public function adminDelAll(){
        //判断请求类型
        if(!Request::isPost()){
            $data = ['info'=>'请求类型不是这个哦，亲','status'=>0];
        }else{
            $map[] = ["ad_id", "in", Request::post('ids')];
            //删除信息
            $info = AdminModel::where($map)->delete();
            if($info){
                //获取要删除的所有头像数据
                $headerImg = AdminModel::getAdminColumn($map, "ad_headerImg");
                foreach ($headerImg as $value){
                    if(!empty($value)) unlink(Config::get('app.upload_url').$value);
                }
                //写入日志
                Log::logAdd(Session::get('userData.ad_id'),'删除管理员'.$info.'个');

                $data = ['info'=>'删除成功','status'=>1];
            }else{
                $data = ['info'=>'不好意思，删除失败了','status'=>0];
            }
        }
        return json($data);
    }
    /*
     * 管理员头像上传
     */
    public function adminFileUpload(){
        $website = website();

        $info = uploadFile("file", Config::get("app.admin_header_url"), $website["sy_photoMaxSize"]);

        return json($info);
    }
//===========================================【管理员消息】==========================================================
    /*
     * 管理员通知消息列表
     */
    public function adminMessage(){
        $userData = Session::get('userData');
        //查询数据
        $info = BackMsg::getBackMsgPage($userData["ad_id"]);
        //管理员权限
        $rules = ['Admin/messageDelAll', 'Admin/messageRead',];
        $check = AuthGroup::checkMethodArray($userData,$rules);

        View::assign('info',$info);
        View::assign('check',$check);
        return View::fetch('adminMessage');
    }
    /*
     * 管理员阅读消息
     */
    public function messageRead(){
        //判断请求类型
        if(!Request::isPost()){
            $data = ['info'=>'请求类型不是这个哦，亲','status'=>0];
        }else {
            $id = Request::post('id');
            //是否成功更新
            if (BackMsg::update(["bm_isRead"=>1], ["bm_id"=>$id])) {
                $data['status'] = 1;
            } else {
                $data['status'] = 0;
            }
        }
        return json($data);
    }
    /*
     * 管理员批量阅读消息
     */
    public function messageReadAll(){
        //判断请求类型
        if(!Request::isPost()){
            $data = ['info'=>'请求类型不是这个哦，亲','status'=>0];
        }else {
            $ids = implode(',',Request::post('ids'));
            //是否成功更新
            if (BackMsg::where("bm_id","in",$ids)->update(["bm_isRead"=>1])) {
                $data['info'] = '成功标记为已读';
                $data['status'] = 1;
            } else {
                $data['info'] = '操作失败';
                $data['status'] = 0;
            }
        }
        return json($data);
    }
    /*
     * 管理员批量删除消息
     */
    public function messageDelAll(){
        //判断请求类型
        if(!Request::isPost()){
            $data = ['info'=>'请求类型不是这个哦，亲','status'=>0];
        }else {
            $ids = Request::post('ids');
            //是否成功删除
            if (BackMsg::where("bm_id","in",$ids)->delete()) {
                $data['info'] = '成功删除所选数据';
                $data['status'] = 1;
            } else {
                $data['info'] = '操作失败';
                $data['status'] = 0;
            }
        }
        return json($data);
    }
    /*
     * 管理员sent-event获取通知消息
     */
    public function getMessage(){
        //header('X-Accel-Buffering: no'); //解决nginx下ob_flush()没有输出缓冲
        header('Content-Type:text/event-stream');//通知浏览器开启事件推送功能
        header('Cache-Control:no-cache');//告诉浏览器当前页面不进行缓存'
        //管理员信息
        $userData = Session::get('userData');
        //未阅读消息
        $noRead["bm_uid"] = $userData['ad_id'];
        $noRead["bm_isRead"] = 0;
        //未发送消息
        $noSend["bm_uid"] = $userData['ad_id'];
        $noSend["bm_isSend"] = 0;
        //赋值数组
        $info = [
            "noRead" => BackMsg::getBackMsgCount($noRead), //未阅读消息
            "noSend" => BackMsg::getBackMsgCount($noSend) //未发送消息
        ];
        //如果没有未发送消息, 将未发送消息变为已发送
        if($info["noSend"]) BackMsg::update(["bm_isSend"=>1], $noSend);
        //赋值输出
        $data = setJsonArray($info);
        echo "data: {$data}\n\n";
        echo "retry: 60000\n"; //指定浏览器重新发起连接的时间间隔
        ob_flush();//刷新
        flush();//刷新
    }
}